package com.ruoyi.caigou.service.impl;

import java.math.BigDecimal;
import java.util.List;

import com.ruoyi.IndexDtoByTwo;
import com.ruoyi.caigou.domain.BuyOrderGoods;
import com.ruoyi.caigou.domain.dto.BuyOrdDTO;
import com.ruoyi.caigou.mapper.BuyOrderGoodsMapper;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.caigou.mapper.BuyOrderMapper;
import com.ruoyi.caigou.domain.BuyOrder;
import com.ruoyi.caigou.service.IBuyOrderService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 采购订单Service业务层处理
 *
 * @author lvql
 * @date 2024-11-02
 */
@Service
public class BuyOrderServiceImpl implements IBuyOrderService {
    @Autowired
    private BuyOrderMapper buyOrderMapper;

    @Autowired
    private BuyOrderGoodsMapper buyOrderGoodsMapper;

    /**
     * 查询采购订单
     *
     * @param id 采购订单主键
     * @return 采购订单
     */
    @Override
    public BuyOrder selectBuyOrderById(Integer id) {
        return buyOrderMapper.selectBuyOrderById(id);
    }

    @Override
    public IndexDtoByTwo getBuyOrderCountAndMoney() {
        return buyOrderMapper.getBuyOrderCountAndMoney();
    }

    /**
     * 查询采购订单列表
     *
     * @param buyOrder 采购订单
     * @return 采购订单
     */
    @Override
    public List<BuyOrder> selectBuyOrderList(BuyOrder buyOrder) {
        return buyOrderMapper.selectBuyOrderList(buyOrder);
    }

    @Override
    public List<BuyOrder> noReconList(BuyOrder buyOrder) {
        return buyOrderMapper.noReconList(buyOrder);
    }

    /**
     * 新增采购订单
     *
     * @param buyOrder 采购订单
     * @return 结果
     */
    @Override
    public int insertBuyOrder(BuyOrder buyOrder) {
        buyOrder.setCreateTime(DateUtils.getNowDate());
        return buyOrderMapper.insertBuyOrder(buyOrder);
    }

    @Transactional
    @Override
    public int insertBuyOrderPlus(BuyOrdDTO buyOrdDTO) {
        BigDecimal bigDecimal = new BigDecimal(0);
        for (BuyOrderGoods buyOrderGood : buyOrdDTO.getBuyOrderGoods()) {
            //采购金额
            buyOrderGood.setPurchaseAmount(
                    buyOrderGood.getPrice()
                            .multiply(new BigDecimal(buyOrderGood.getPurchaseQuantity()))
                            .multiply(new BigDecimal(buyOrderGood.getDiscount()))
            );
            bigDecimal = bigDecimal.add(buyOrderGood.getPurchaseAmount());
            buyOrderGoodsMapper.insertBuyOrderGoods(buyOrderGood);
        }
        buyOrdDTO.getBuyOrder().setTotalAmount(bigDecimal);
        buyOrdDTO.getBuyOrder().setDocMakeUserId(Math.toIntExact(SecurityUtils.getUserId()));
        buyOrdDTO.getBuyOrder().setCreateTime(DateUtils.getNowDate());
        buyOrdDTO.getBuyOrder().setCreateBy(SecurityUtils.getUsername());
        buyOrdDTO.getBuyOrder().setPaidAmount(BigDecimal.ZERO);
        return insertBuyOrder(buyOrdDTO.getBuyOrder());
    }

    /**
     * 修改采购订单
     *
     * @param buyOrder 采购订单
     * @return 结果
     */
    @Override
    public int updateBuyOrder(BuyOrder buyOrder) {
        buyOrder.setUpdateTime(DateUtils.getNowDate());
        return buyOrderMapper.updateBuyOrder(buyOrder);
    }

    @Transactional
    @Override
    public int updateBuyOrderPlus(BuyOrdDTO buyOrdDTO) {
        BuyOrder buyOrder = buyOrdDTO.getBuyOrder();
        buyOrder.setUpdateTime(DateUtils.getNowDate());
        BigDecimal bigDecimal = new BigDecimal(0);
        for (BuyOrderGoods buyOrderGood : buyOrdDTO.getBuyOrderGoods()) {
            //采购金额
            buyOrderGood.setPurchaseAmount(
                    buyOrderGood.getPrice()
                            .multiply(new BigDecimal(buyOrderGood.getPurchaseQuantity()))
                            .multiply(new BigDecimal(buyOrderGood.getDiscount()))
            );
            bigDecimal = bigDecimal.add(buyOrderGood.getPurchaseAmount());

            buyOrderGoodsMapper.updateBuyOrderGoods(buyOrderGood);
        }
        buyOrdDTO.getBuyOrder().setTotalAmount(bigDecimal);
        return buyOrderMapper.updateBuyOrder(buyOrder);
    }

    @Override
    public int approvalBuyOrder(BuyOrder buyOrder) {
        buyOrder.setApprovalUserId(Math.toIntExact(SecurityUtils.getUserId()));
        return buyOrderMapper.updateBuyOrder(buyOrder);
    }

    @Override
    public int updateBuyOrderByCode(BuyOrder buyOrder) {
        return buyOrderMapper.updateBuyOrderByCode(buyOrder);
    }

    /**
     * 批量删除采购订单
     *
     * @param ids 需要删除的采购订单主键
     * @return 结果
     */
    @Override
    public int deleteBuyOrderByIds(Integer[] ids) {
        return buyOrderMapper.deleteBuyOrderByIds(ids);
    }

    @Transactional
    @Override
    public int deleteBuyOrderByIdsPlus(Integer[] ids) {
        for (Integer id : ids) {
            BuyOrder buyOrder = buyOrderMapper.selectBuyOrderById(id);
            if (buyOrder != null) {
                buyOrderGoodsMapper.deleteBuyOrderGoodsByBuyOrderCode(buyOrder.getCode());
            }
        }
        return buyOrderMapper.deleteBuyOrderByIds(ids);
    }

    /**
     * 删除采购订单信息
     *
     * @param id 采购订单主键
     * @return 结果
     */
    @Override
    public int deleteBuyOrderById(Integer id) {
        return buyOrderMapper.deleteBuyOrderById(id);
    }


}
